package j2024.j202410;

public class j1027 {
    /**
     * 19. 删除链表的倒数第 N 个结点
     * 给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。
     * @param head
     * @param n
     * @return
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode ret = new ListNode(-1);
        ret.next = head;
        ListNode prev = ret;
        ListNode cur = ret;
        while(n>0){
            cur = cur.next;
            n--;
        }
        while(cur.next!=null){
            cur = cur.next;
            prev = prev.next;
        }
        prev.next = prev.next.next;
        return ret.next;
    }

    /**
     * 25. K 个一组翻转链表
     * 给你链表的头节点 head ，每 k 个节点一组进行翻转，请你返回修改后的链表。
     *
     * k 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
     *
     * 你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
     * @param head
     * @param k
     * @return
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        int n = 0;
        ListNode tmp = head;
        while(tmp!=null){
            n++;
            tmp = tmp.next;
        }
        n/=k;
        ListNode ret = new ListNode(-1);
        ListNode prev = ret;
        ListNode cur = head;
        for (int i = 0; i < n; i++) {
            ListNode t = cur;
            for (int j = 0; j < k; j++) {
                ListNode next = cur.next;
                cur.next = prev.next;
                prev.next = cur;
                cur = next;
            }
            prev = t;
        }
        prev.next = cur;
        return ret.next;
    }
}
